package com.zs.interceptors;


import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
* 1. 创建一个类实现拦截器接口HandlerInterceptor
* 2. 选择重写三个方法 preHandle、 postHandle、 afterCompletion
* 3. mvc对应ioc配置文件中
* */
public class MyInterceptor implements HandlerInterceptor {
    /*
    * pre -> 前
    * preHandle -> 调用handler之前
    * boolean -> 是否方形 true 放行 | false 拦截
    * 登录保护 || 编码格式
    * @param request 请求对象
    * @param response 响应对象
    * @param handler 处理器对象|| 调用目标handler
    * */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("******preHandle*******");
        return true;
    }
    /*
    * post -> 后
    * postHandle -> handler执行以后调用
    *postHandle 已经不能再拦截了 ！！！ + 如果handler报错， 此方法不执行 ！！！
    * @param request 请求对象
    * @param response 响应对象
    * @param handler 处理器对象|| 调用目标handler
    * @param modelAndView 本次返回的视图和共享数据 || ResponseBody 为 null
    * * */


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("******postHandle*******");
    }

    /*
    * after -> ceo 返回前端数据之前调用
    * 对比postHandle的区别是： 他更靠后， 不管报不报错，一定执行
    * @param request 请求对象
    * @param response 响应对象
    * @param handler 处理器对象|| 调用目标handler
    * @param ex 报错了，获取错误信息
    *
    * */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("******afterCompletion*******");
    }
}
